print("abcaaa".count("a"))
#类：变量：实例变量、类变量+操作他们的方法，局部变量
#本质：把需要管理的数据封装到实例里面，然后基于类中的方法定义规则，以此来失效业务数据的完整性和一致性（防止出现脏数据）
#类变量：不加self表示类变量，不需要实例化就可以直接使用，类变量在整个实例化的对象中是公用的，类变量通常不作为实例变量使用
#局部变量：在方法中或者函数中定义，就是局部变量
#数据成员：类变量或者实例变量
#实例变量：加了self的表示实例变量，定义在方法中的变量，只作用于当前实例的类
# class Person:
#     count=0
#     def __init__(self,name):
#         self.name=name

class Person:  #父类
    count=0 #类变量
    def __init__(self,name):
        self.name=name #实例变量，
    def get_name(self):#self传递的参数是实例的内存地址，告诉这个方法使用哪个实例的数据
        return  self.name
    def set_name(self):
        self.name="globle"
# p=Person()  #实例p
# p1=Person() #实例p1
# print(id(p))  #实例p地址
# print(id(p1))  #实例p1地址
# print(id(Person)) #类地址
#类在内存中只有一个份，每个实例有各自在内存中保存的地址，各自独立

wxy=Person("王晓艳")
print(wxy.get_name())

#子类继承了所有的父类方法
#子类中需要初始化父类，提供完整的构造函数的初始化，满足父类的所有参数使用要求

#子类没有实现__init__方法时，会自动调用父类的__init__方法
#父类中__init__方法如果需要传入参数，则会报错，需要在实例化时候传入参数
#父类中的私有方法和私有类，不能被子类调用和继承
class Teacher(Person): #子类
    count=0
    def __init__(self,name,salary):
        Person.__init__(self,name)
        self.salary=salary
        Teacher.count+=1

    def get_name(self):#重写，overridde:把父类的方法做了重写
        return "光荣之路："+self.name

t=Teacher("WXY",1000) #触发了__init__的执行了，叫实例化
print(t.get_name())
s=Teacher("TSH",10000)
print(s.get_name())
print(Teacher.count)
print(t.count)


#判断是否是类的实例
if isinstance(t,Person):
    print("t是Person的实例")
else:
    print("t不是Teacher的实例")




#python新式类，广度优先
# 1、类为经典类时，多继承情况下，会按照深度优先查找
# 2、类为新式类时，多继承情况下，会按照广度优先查找
class D:
    def test(self):
        print("D")

class C(D):
    def test(self):
        print("C")

class B(D):
    def test(self):
        print("B")

class A(B, C):
    def test(self):
        print("A")

a = A()
a.test()
#广度优先：当调用A类test函数时，如下图所示，先查找A类有无test函数，再查找B类，再查找C类，最后查找D类。
# 深度优先：当调用A类test函数时，如下图所示，先查找A类中有无test函数，再查找B类，再查找D类，最后查找C类